package com.planw.beetl.utils;

import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiType;
import com.intellij.psi.util.PsiUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import org.apache.commons.lang3.StringUtils;

public class PsiKt {

  private static final List<String> primitiveClasses = new ArrayList<>();

  static {
    primitiveClasses.add(Integer.TYPE.getCanonicalName());
    primitiveClasses.add(Integer.class.getCanonicalName());
    primitiveClasses.add(Double.TYPE.getCanonicalName());
    primitiveClasses.add(Double.class.getCanonicalName());
    primitiveClasses.add(Float.TYPE.getCanonicalName());
    primitiveClasses.add(Float.class.getCanonicalName());
    primitiveClasses.add(Short.TYPE.getCanonicalName());
    primitiveClasses.add(Short.class.getCanonicalName());
    primitiveClasses.add(Byte.TYPE.getCanonicalName());
    primitiveClasses.add(Byte.class.getCanonicalName());
    primitiveClasses.add(Character.TYPE.getCanonicalName());
    primitiveClasses.add(Character.class.getCanonicalName());
    primitiveClasses.add(Long.TYPE.getCanonicalName());
    primitiveClasses.add(Long.class.getCanonicalName());
    primitiveClasses.add(Boolean.TYPE.getCanonicalName());
    primitiveClasses.add(Boolean.class.getCanonicalName());
    primitiveClasses.add(String.class.getCanonicalName());
  }

  /**
   * 是否是基础类型，包括包装类和String
   */
  public static boolean isPrimitive(PsiType psiType) {

    return primitiveClasses.contains(getClassName(psiType)) || primitiveClasses
        .contains(psiType.getCanonicalText());
  }

  /**
   * 是否是基础类型，包括包装类和String
   */
  public static String getClassName(PsiType psiType) {

    PsiClass psiClass = PsiUtil.resolveClassInType(psiType);
    if (psiClass == null) {
      return psiType.getCanonicalText();
    }
    return Optional.ofNullable(psiClass).map(PsiClass::getQualifiedName).orElse(StringUtils.EMPTY);
  }

}
